2 Problem: 10482 - The Candyman can
14 const int SIZE
= 40, MAXN
= 32;
17 dp[i][a][b] = verdadero si puedo repartir las primeras
18 i monedas en tres grupos tales que el grupo con mayor peso
19 tenga a unidades más que el grupo con menos peso & el grupo
20 de la mitad tenga b unidades más que el grupo con menos peso
22 bool dp
[MAXN
][SIZE
+1][SIZE
+1];
27 for (int C
=1; C
<=Casos
; C
++){
31 for (int i
=0; i
<n
; ++i
){
38 for (int i
=0; i
<n
; ++i
)
39 for (int a
=0; a
<=sum
; ++a
)
40 for (int b
=0; b
<=sum
; ++b
)
44 dp
[0][w
[0]][0] = true;
45 for (int i
=0; i
<n
-1; ++i
)
46 for (int a
=0; a
<=sum
; ++a
)
47 for (int b
=0; b
<=sum
; ++b
)
49 for (int j
=0; j
<3; ++j
){
51 t
[0] = a
, t
[1] = b
, t
[2] = 0;
53 sort(t
.begin(), t
.end());
54 if (t
[2] - t
[0] <= sum
){
55 dp
[i
+1][t
[2] - t
[0]][t
[1] - t
[0]] = true;
60 for (int a
=0; a
<=sum
&& answer
== -1; ++a
)
61 for (int b
=0; b
<=a
&& answer
== -1; ++b
)
66 printf("Case %d: %d\n", C
, answer
);